# Z-score异常值检测
# Z-Score也称为标准分数，是一维或低维特征空间中的参数异常检测方法。假定数据服从高斯分布，异常值是分布尾部的数据点，远离数据的平均值。
# 基于正态分布的3σ法则或Z-score方法是以假定数据服从正态分布为前提的，但实际数据往往并不严格服从正态分布。
# 它们判断异常值的标准是以计算数据批的均值和标准差为基础的，而均值和标准差的耐抗性极小，异常值本身会对它们产生较大影响。
# 应用这种方法于非正态分布数据中判断异常值，其有效性是有限的。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import xlrd  #读Excel数据用

def z_score(data):
    for idx, item in enumerate(data):
        z_score_item = (item - np.mean(data)) / np.std(data)
        z_score_item = np.abs(z_score_item)
        if z_score_item >= 2.5:  #手动设置的阈值 阈值一般设置为2.5、3.0或3.5
            print(item)


file_location = "D:\服创\数数数学学学建建建模模模\鸢尾花X数据.xlsx"
data = xlrd.open_workbook(file_location) #	data是Excel里的数据
sheet = data.sheet_by_index(0)  #读取到第一张表格
days = [sheet.cell_value(r,1) for r in range(1,sheet.nrows)]   # 读取到第1列的所有值
print(days)

print("异常点为：")
z_score(days)

